#ifndef PHYSICS_H_
#define PHYSICS_H_

#include "utypes.h"

/** @defgroup Physics Physics
 * @{
 *
 * Physics related functions
 */


/** Tipos de física
 */
enum PhysicsMode {
	PHYS_NORMAL,
	PHYS_HELI,
	PHYS_BYKE,
	PHYS_FROG,
	PHYS_HEAD,
	PHYS_EAGLE,
	PHYS_CLOUD,
	PHYS_SCORPION,
};

/** Definição de uma física 
 */
typedef struct Physics_ {
	/** Tipo da física */
	enum PhysicsMode mode;
	float g;        /**< aceler. da gravidade */
	float a;        /**< atrito em x */
	float vx; 	/**< velocidade em x */
	float vy;	/**< velocidade em y */

	float x;	/**< Posição X do sprite */
	float y;	/**< Posição Y do sprite */
	int h;		/**< Altura do sprite */
	int w;		/**< Largura do sprite */

	float vx_inc;	/**< Incremento em X */
	float vx_dec;	/**< Decremento em X */
	float vy_inc;	/**< Incremento em Y */
	float vy_dec;	/**< Decremento em Y */

	Bool x_stop;	/**< Parado em X? */
	Bool y_stop;	/**< Parado em Y? */

	float vx_min;	/**< Velocidade mínima em X */
	float vx_max;	/**< Velocidade máxima em X */
	float vy_max;	/**< Velocidade máxima em Y */

	float vy_stop;	/**< Velocidade em Y quando há paradas */

	Bool msec_init; /**< O contador de milisegundos foi inicializado? */
 	unsigned int msec;	/**< Último valor do contador de milisegundos */
} Physics;

/** Inicializa uma variável de física
 *
 * \param phys Física a ser inicializada
 * \param mode Tipo de física
 * \param x Posição X do sprite
 * \param y Posição Y do sprite
 * \param w Largura do sprite
 * \param h Altura do sprite
 */
void physics_init (Physics *phys, enum PhysicsMode mode, int x, int y, int w, int h);

void physics_selector(int mode);
//void physics(int * xx, int * yy, int width, int height);

/** Faz o update da física do Alex Kidd
 * \param phys Física
 * \param xx Endereço onde o novo valor de X é retornado
 * \param yy Endereço onde o novo valor de Y é retornado
 */
void physics_alex (Physics *phys, int * xx, int * yy);


void physics_frog(int * xx, int * yy, int width, int height);
void physics_head(int * xx, int * yy, int width, int height);

/** Faz o update da física da águia
 * \param phys Física
 * \param xx Endereço onde o novo valor de X é retornado
 * \param yy Endereço onde o novo valor de Y é retornado
 */
void physics_eagle (Physics *phys, int * xx, int * yy);

/** Faz o update da física do escorpião
 * \param phys Física
 * \param xx Endereço onde o novo valor de X é retornado
 * \param yy Endereço onde o novo valor de Y é retornado
 */
void physics_scorpion (Physics *phys, int * xx, int * yy);

/** Faz o update da física das núvens
 * \param phys Física
 * \param xx Endereço onde o novo valor de X é retornado
 * \param yy Endereço onde o novo valor de Y é retornado
 */
void physics_cloud (Physics *phys, int * xx, int * yy);


/** @} end of physics */

#endif

